"""
1、二维向量之间的点积操作指向余弦相似度。如何理解这个相似度。
2、向量之间的正交指的是两个向量的夹角为90度。说明两个向量中没有关联。
"""

import torch
# 计算平面直角坐标系二维向量的坐标
def circle_value(tangle):
    # tangle = 30
    tangle = tangle/180 *torch.pi
    # print(tangle)
    return torch.FloatTensor([torch.cos(tangle),torch.sin(tangle)])

# 得到 0、10、20、45、90度的坐标向量
tangle1 = torch.FloatTensor([0])
print(circle_value(tangle1))
tangle2 = torch.FloatTensor([10])
print(circle_value(tangle2))
tangle3 = torch.FloatTensor([20])
print(circle_value(tangle3))
tangle4 = torch.FloatTensor([45])
print(circle_value(tangle4))
tangle5 = torch.FloatTensor([90])
print(circle_value(tangle5))

# 计算角度为 0  和 10 度的向量点积，
print(circle_value(tangle1)@circle_value(tangle2))
# 计算角度为 10  和 20 度的向量点积，角度差相同和0-10度的向量点积相等。
print(circle_value(tangle2)@circle_value(tangle3))
# 计算角度为 0  和 20 度的向量点积，小于0-10度向量点积和10-20度向量点积。
print(circle_value(tangle1)@circle_value(tangle3))
# 计算角度为 10  和 45 度的向量点积，小于0-20度向量点积。进一步减少了两者的相关度。
print(circle_value(tangle2)@circle_value(tangle4))
# 计算角度为 0  和 90  度向量之间的点积，为 0 表示正交，0相关。
print(circle_value(tangle1)@circle_value(tangle5))


tangle6 = torch.FloatTensor([47])
print(circle_value(tangle6))
tangle7 = torch.FloatTensor([137])
# 计算 47 度和 137 度向量之间的点积，为 0 表示正交，0相关。
print(circle_value(tangle7))
print(circle_value(tangle6)@circle_value(tangle7))
"""
3、向量在不同维度上的信息存在相互抵消的性质，确保了正交性。
a = [ 0.6820,  0.7314]
b = [-0.7314,  0.6820] 两个正交向量，可以组成一组标准正交基。
"""

"""
4、这种性质可以扩展到多维空间上，依然有效。因此N维空间中可以找到N个向量作为一组标准正交基。
5、假设我们找到6种事物，划分为两组，要表示第一组和第二组信息完全没有关系。我们应该用两个正交向量表示这两组事物。
使得他们之间的点积的和为0。这里需要说明的是正交基不是唯一的。
"""

"""
6、现在我们来看自注意力，就是针对单个句子的自编码形式，它分析了自己的语义，利用句子中各个元素的新权重，重组更新各个元素特征。
如果我们将句子进行分词，分词后每一个词都用一个向量做特征表示。特征乘积的关系如下：
"""
print(torch.randn([4]).softmax())

"""
7、在图神经网络中，邻接矩阵的本质是一种全局关系，举例说明：如果一句话中有6个单词，计算自身之间的关系，可以组成一个6*6的邻接矩阵。
主对角线上的关系，代表了句子每一个词与自身的关系。而其余位置上则对应着所有词与词之间的对应关系。
如果是随机抽选两个句子，首先需要对所有分词都组成一个长序列,然后组成一个大的邻接矩阵，再找词（向量）与词（向量）之间的关系。
8、其中
"""

# c = torch.FloatTensor([0.5,0.866])
# d = torch.FloatTensor([0.866,0.5])
# print(c@d)
